/*************************************************************/
/*                                                           */
/*     MC823 - Laboratorio de Teleprocessamento e Redes      */
/*     1 Semestre / 2013                                     */
/*     Projeto 1 - Cliente e Servidor TCP/UDP de uma Livraria*/
/*                                                           */
/*     Alunos: Joao Gabriel M.D.Mendes - RA 102788           */
/*             Lucas Domingues Lima    - RA 103140           */
/*                                                           */
/*************************************************************/

/* Arquivo: /cliente/requisicoes.c
   Definicao: Funcoes para manipular as strings referentes as mensagens
   			  E utilizado pelo cliente.c para montar as mensagens que
   			  serao enviadas para o servidor de forma automatica,
   			  facilitando testes e mensuracoes.
*/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "requisicoes.h"

#define TAM_MAX_BUF 100

//retorna o numero de ISBNs presente no arquivo passado por parametro
int retornaNumISBNs(FILE *arq)
{
	int i;
	char c;
    
    i=0;
    fscanf(arq,"%c",&c);
    while(!feof(arq))
    {
        if(c == '\n')
            i++;
        fscanf(arq,"%c",&c);
	}

    fseek(arq,0,SEEK_SET);

    return i;
}

//retorna lista de strings. Cada string dessa lista e um ISBN lido
//do arquivo passado como parametro.
char** carregaArquivo(char *nomearq,int *tam)
{
    int i,j;
    FILE *arq;
    char c,buf[TAM_MAX_BUF],**temp;

    arq = fopen(nomearq,"r");

    *tam = retornaNumISBNs(arq);
    temp = (char**) malloc(sizeof(char*)*(*tam));
    
    j=0;
    while(!feof(arq))
    {
		i=0;
        fscanf(arq,"%c",&c);
        while(c != '\n' && !feof(arq))
        {
            buf[i++] = c;
            fscanf(arq,"%c",&c);
        }
        if(!feof(arq))
        {
            buf[i] = '\0';
            temp[j] = strdup(buf);
            j++;
        }
    }

    return temp;
}

// -------- FUNCOES DE CRIACAO DE MENSAGENS ------------

char* criaMsgCDE(char tipo, char **ISBNs, int tam)
{
    char* msg;
    char* isbn;
    msg = malloc(sizeof(char)*(1+1+10+1+1));
    
    isbn = ISBNs[random()%tam];
    msg[0] = tipo;
    msg[1] = '0';
    strcpy(&msg[2],isbn);
    msg[12]='*';
    msg[13]='\0';
    return msg;
}

char* criaMsgF(char **ISBNs, int tam)
{
    char* qtd;
    char* msg;
    char* isbn;
    msg = malloc(sizeof(char)*(1+1+10+3+1+1+2));
    
    qtd = malloc(sizeof(char)*4);
    sprintf(qtd,"%03d",random()%999);
    
    isbn = ISBNs[random()%tam];
    msg[0] = 'F';
/*----- msg[1] = '1'; - Cliente do tipo Livraria -----*/
/*----- msg[1] = '0'; - Cliente do tipo usuario  -----*/
    msg[1] = '0';
    strcpy(&msg[2],isbn);
    strcpy(&msg[12],qtd);
    msg[15]='*';
    msg[16]='\0';
    return msg;
    
}

//funcao principal que retorna a mensagem pronta para ser enviada
// ao servidor. E invocada diretamente pelo cliente.c
char* retornaRequisicao(int opcao,char **ISBNs,int tam)
{
	switch(opcao)
	{	
		case 1: return strdup("A0*");
		case 2: return strdup("B0*");
		case 3: return criaMsgCDE('C',ISBNs,tam); 
		case 4: return criaMsgCDE('D',ISBNs,tam);
		case 5: return criaMsgCDE('E',ISBNs,tam);
		case 6: return criaMsgF(ISBNs,tam);
		default: return NULL; 
	}
}

//funcao de limpeza
void desalocaVetorISBNs(char **vetor,int n)
{
    int i;
    for(i=0;i<n;i++)
        free(vetor[i]);
    free(vetor);
}
